/*
 * Copyright (c) Huawei Device Co., Ltd. 2023. All rights reserved.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef ACCESS_CONTROL_ENFORCER_H
#define ACCESS_CONTROL_ENFORCER_H
#include <string>
#include "ability_info.h"
#include "bundle_mgr_interface.h"
#include "bundle_mgr_proxy.h"
#include "access_rule_cache.h"

namespace OHOS {
namespace SE {
class SecureElementAgent;
struct NfcExtInterface {
    bool (*checkBundleNamePermission)(const char* bundleName) = nullptr;
    bool (*isSystemUid)(const uint32_t uid) = nullptr;
};

/*
 * Software that is part of the Secure Element access API, it obtains access
 * rules from the Secure Element and applies those rules to restrict device
 * application access to the various Secure Element applications.
 */
class AccessControlEnforcer {
public:
    AccessControlEnforcer(std::weak_ptr<SecureElementAgent> agent);
    AccessControlEnforcer(bool isAra, bool isArf, std::weak_ptr<SecureElementAgent> agent);
    ~AccessControlEnforcer();

    /**
     * @brief Is channel access allowd or not.
     * @param uid The uid of calling application.
     */
    bool IsChannelAccessAllowed(const uint32_t& uid);
    bool IsAllowedByAidAndAppId(const std::vector<uint8_t> &aid, const uint32_t &uid);
    bool IsAllowedByFingerPrint(uint32_t uid);

private:
    bool IsSystemUid(const uint32_t& uid);
    bool CheckBundleNamePermission(const std::string& bundleName);
    sptr<AppExecFwk::IBundleMgr> GetBundleMgrProxy();
    bool GetBundleInfo(const std::string &bundleName, AppExecFwk::BundleInfo &bundleInfo);
    // handle of nfc ext service
    void *nfcExtHandle_ = nullptr;
    NfcExtInterface nfcExtInf_;
    bool isAra_;
    bool isArf_;
    std::weak_ptr<SecureElementAgent> agent_;
    std::shared_ptr<AccessRuleCache> accessCache_;
};
}  // namespace SE
}  // namespace OHOS
#endif // ACCESS_CONTROL_ENFORCER_H
